"""
@Author  : 康帅
@Time    : 2021/5/27 14:57
@Function: Python redis Set使用
"""


import redis

#  使用连接池连接，避免每次建立、释放连接的开销
# redis 取出的结果默认是字节，我们可以设定 decode_responses=True 改成字符串
pool = redis.ConnectionPool(host='127.0.0.1', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)

"""
新增
sadd(name,values)
"""
r.sadd("set1", 33, 44, 55, 66)  # 往集合中添加元素

"""
获取元素个数 类似于len
scard(name)
"""
print(r.scard("set1"))

"""
获取集合中所有的成员
smembers(name)
"""
print(r.smembers("set1"))

"""
获取集合中所有的成员--元组形式
sscan(name, cursor=0, match=None, count=None)
"""
print(r.sscan(name="set1"))

"""
获取集合中所有的成员--迭代器的方式
sscan_iter(name, match=None, count=None)
"""
for i in r.sscan_iter("set1"):
    print(i)

"""
差集
sdiff(keys, *args)
"""
r.sadd("set2", 11, 22, 33)
print(r.smembers("set1"))  # 获取集合中所有的成员
print(r.smembers("set2"))
print(r.sdiff("set1", "set2"))  # 在集合set1但是不在集合set2中
print(r.sdiff("set2", "set1"))  # 在集合set2但是不在集合set1中

"""
差集--差集存在一个新的集合中
sdiffstore(dest, keys, *args)
"""
r.sdiffstore("set3", "set1", "set2")  # 在集合set1但是不在集合set2中
print(r.smembers("set3"))  # 获取集合3中所有的成员

"""
交集
sinter(keys, *args)
"""
print(r.sinter("set1", "set2"))  # 取2个集合的交集

"""
交集--交集存在一个新的集合中
sinterstore(dest, keys, *args)
"""
print(r.sinterstore("set3", "set1", "set2"))  # 取2个集合的交集
print(r.smembers("set3"))

"""
并集
sunion(keys, *args)
"""
print(r.sunion("set1", "set2"))  # 取2个集合的并集

"""
并集--并集存在一个新的集合
sunionstore(dest,keys, *args)
"""
print(r.sunionstore("set3", "set1", "set2"))  # 取2个集合的并集
print(r.smembers("set3"))

"""
判断是否是集合的成员 类似in
sismember(name, value)
"""
print(r.sismember("set1", 33))  # 33是集合的成员
print(r.sismember("set1", 23))  # 23不是集合的成员

"""
移动
smove(src, dst, value)
"""
r.smove("set1", "set2", 44)
print(r.smembers("set1"))
print(r.smembers("set2"))

"""
删除--随机删除并且返回被删除值
spop(name)
从集合移除一个成员，并将其返回,说明一下，集合是无序的，所有是随机删除的
"""
print(r.spop("set2"))  # 这个删除的值是随机删除的，集合是无序的
print(r.smembers("set2"))

"""
删除--指定值删除
srem(name, values)
"""
print(r.srem("set2", 11))  # 从集合中删除指定值 11
print(r.smembers("set2"))
